package com.geekhalo.admin.app;

import com.geekhalo.admin.app.app.WebApplicationCommandApplication;
import com.geekhalo.admin.app.app.WebApplicationQueryApplication;
import com.geekhalo.admin.app.app.query.PageByStatus;
import com.geekhalo.admin.domain.app.WebApplicationView;
import com.geekhalo.admin.domain.app.create.CreateWebApplicationCommand;
import com.geekhalo.admin.domain.app.disable.DisableWebApplicationCommand;
import com.geekhalo.admin.domain.app.enable.EnableWebApplicationCommand;
import com.geekhalo.admin.domain.app.update.UpdateWebApplicationCommand;
import com.geekhalo.lego.core.singlequery.Page;
import com.geekhalo.lego.core.web.RestResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;



/**
 * 使用 react 和 antd 为前端框架，生成前端页面
 * 应用管理功能：
 * 1. 根据应用状态进行搜索（search 接口）
 * 2. 对搜索结果进行分页
 * 3. 每行记录包括名称（name），编码（code），描述（desc），状态（status)，最后一列是操作列，操作包括 启动，禁用，编辑，其中 启用和禁用 根据应用状态自动为设置状态
 * 4. 点击启用、禁用 自动发送请求，以消息的方式提示操作结果，同时刷新表格重新加载数据
 * 5. 点击编辑，弹窗编辑弹窗，可编辑内容包括显示名称(name)，描述（desc），点击保存后，发送请求，以消息的方式提示操作结果，关闭编辑弹窗，最后刷新表格重新加载数据
 * 6. 表格右上角有一个“创建”按钮，点击后弹窗创建用户弹窗，可编辑内容包括名称(name), 描述(desc), 编码(code)，点击保存后，发送请求，以消息的方式提示操作结果，关闭创建弹窗，最后刷新表格重新加载数据
 *
 */
@RestController
@RequestMapping("webApp")
public class WebAppController {
    @Autowired
    private WebApplicationCommandApplication webApplicationCommandApplication;
    @Autowired
    private WebApplicationQueryApplication webApplicationQueryApplication;

    @PostMapping("search")
    public RestResult<Page<WebApplicationView>> search(@RequestBody PageByStatus query){
        Page<WebApplicationView> webApplicationViewPage = this.webApplicationQueryApplication.pageOf(query);
        return RestResult.success(webApplicationViewPage);
    }

    @PostMapping("create")
    public RestResult<Void> create(@RequestBody CreateWebApplicationCommand command){
        this.webApplicationCommandApplication.create(command);
        return RestResult.success();
    }

    @PostMapping("update")
    public RestResult<Void> update(@RequestBody UpdateWebApplicationCommand command){
        this.webApplicationCommandApplication.update(command);
        return RestResult.success();
    }

    @PostMapping("enable")
    public RestResult<Void> enable(@RequestBody EnableWebApplicationCommand command){
        this.webApplicationCommandApplication.enable(command);
        return RestResult.success();
    }
    @PostMapping("disable")
    public RestResult<Void> disable(@RequestBody DisableWebApplicationCommand command){
        this.webApplicationCommandApplication.disable(command);
        return RestResult.success();
    }
}
